Diferenças entre VMs e Containers

Tempo estimado de leitura: 3min

Recomendação de materiais

Relembrando FSO

Conceito"Definição"
Sistema OperacionalKernel + Apps de Sistema
Kernelcoração do S.O., primeiro programa executado quando se inicia um SO;
responsavel por gerenciar recursos do computador [uso da cpu, memoria ram, etc] de acordo com as demandas de Apps de Sistema e Apps comuns
A interface entre Software e Hardware
Apps de Sistemasistema de arquivos, programas de network, drivers etc;
(nao sao os programas "comuns", como navegador, vscode, discord etc)

Aprofundando um pouco em Máquinas Virtuais

Existem dois tipos de Hypervisors (softwares que lidam com VMs):

DistinçõesTipo 2Tipo 1
Conhecido como:Virtual Machine Monitor (VMM)Nativo/Bare Metal
Softwares:Qemu, VMware Workstation, Oracle Virtual BoxXen HVM, KVM*, VMware vSphere
Onde roda:Em cima do sistema operacional que voce estiver utilizandoNo Hardware do seu computador (usa a bios e td mais)
Na prática:O mais comum/conhecido: você instala um aplicativo no seu PC, e nele tem uma tela pra você adicionar os SO's que quiser. Então, voce pode bootar em qualquer um desses SO's que estarão disponiveis em janelas de aplicativo diferentes.No geral, em vez de instalar um sistema operacional, se instala o Hypervisor, e neste você será capaz de instalar varios S.Os (chamados de guests) distintos; A diferença disso p/ um dual-boot, por exemplo, é que multiplos SOs podem ser executados simultaneamente

Ou seja, no tipo 1, o Hypervisor pode ser considerado um Kernel; no tipo 2, o Hypervisor se aproveita do Kernel utilizado para gerenciar os recursos de suas VMs

Lembrando que cada máquina virtual, naturalmente, terá seu próprio Sistema Operacional e, consequentemente, seu próprio Kernel, também!


Fontes:

Aprofundando um pouco em Containers

Containers consistem de virtualizações do Sistema Operacional (em vez do Hardware). Têm como caracteristicas o isolamento e gerenciamento de recursos. Isso é possível pela existencia das seguintes funcionalidades do Kernel Linux:

  • Namespaces: responsavel pelo isolamento [processos distintos enxergam recursos (hostnames, ids de usuarios, ids de processos, etc) distintos]

  • Cgroups: responsavel pelo gerenciamento de recursos [limita, prioriza e controla grupos de processos quanto ao uso de CPU, memória, I/O, network, etc]

Ou seja, com apenas 1 Kernel (o do computador que está utilizando agora) consegue-se instanciar inumeros containers (todos se utilizando do seu Kernel), sendo que cada um destes é apenas um processo a mais no seu computador.

Justamente por isso, você não conseguiria rodar um container com imagem Windows num pc Linux: via de regra, o kernel especificado no seu Dockerfile tem de ser compativel com o sistema operacional do seu computador.

*mas é possivel utilizar imagens linux dentro do windows, caso utilize o WSL (Windows Subsystem for Linux)


Fontes:

Resumo

VirtualizaçãoComportamento
Máquinas Virtuais
Container DockerContainer

Ou seja, num cenário onde você gostaria de rodar seu app multiplas vezes simultaneamente (por questões de escalabilidade, por exemplo):

VMsContainers
Necessitaria de 1 máquina virtual para cada instancia;
cada máquina virtual necessita, normalmente, de dezenas de GB para armazenar no Host
geralmente precisa-se de alguns minutos para bootar
necessita-se de apenas 1 imagem (que pesa lá seus 200mb~1gb) e pode-se instanciar infinitas vezes, de forma quase instantanea